/**
 * 
 * @author aj60940	Mathieu Lavallee
 *
 * @version 1.0
 * 
 * Commande:
 * ce que le client desire recevoir
 * (vector de produit)
 */

//	- Un constructeur par defaut ou parametre
//	- Un constructeur par copie
//	- La methode publique toString

package carnetCommandes;

import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.Vector;

import restaurant.*;
import Usager.*;

public class Commande extends Observable {

	private Vector<LigneCommande> vectCommande;

	// Informations de la commande
	private Profil profilClient;
	//private Adresse adresseRestaurant;

	// private Profil profil;
	// private Livreur;
	private static int numStatic = 0;
	private int numeroCommande;
	private Double prixTotal = 0.0;
	private String date = null;
	private String heure = null;
	private boolean confirmerClient = false;
	private boolean confirmerLivreur = false;

	/**
	 * constructeur par default Cree un nouveau vecteur de assigne
	 * */
	public Commande(Profil profilClient) {

		this.profilClient = profilClient;
		//this.setAdresseRestaurant(adresseRestaurant);

		// Initialisation des variables
		vectCommande = new Vector<LigneCommande>();
		setNumeroCommande();
	}

	/**
	 * constructeur par copie
	 * 
	 * @param commande
	 *            a copier
	 */
	public Commande(Commande commande) {

		vectCommande = commande.vectCommande;
		profilClient = commande.getProfilClient();
		//adresseRestaurant = commande.getAdresseRestaurant();
		numeroCommande = commande.getNumeroCommande();
		prixTotal = commande.getPrixTotal();
		date = commande.getDate();
		heure = commande.getHeure();
		confirmerClient = commande.estConfirmerParClient();
		confirmerLivreur = commande.estConfirmerParLivreur();
	}

	/**
	 * AJoute produit permet d'ajouter un produit au vecteur recalcule le prix
	 * total a la fin
	 * 
	 * @param produit
	 *            a ajouter
	 */
	public void addProduit(LigneCommande ligneCommande) {
		vectCommande.add(ligneCommande);
		calculPrixTotal();
	}
	
	public void addProduit(List<LigneCommande> list) {

		Iterator<LigneCommande> itr = list.iterator();
		while (itr.hasNext()) {
			vectCommande.add(itr.next());
		}

		calculPrixTotal();
	}
	
	public LigneCommande getLigneCommande(int index) throws Exception{
		
		return vectCommande.get(index);
	}
/*	
	public LigneCommande getLigneCommande(LigneCommande ligneCommande) throws Exception{
		
		return vectCommande.get(ligneCommande.);
	}
	
	*/

	/**
	 * enleve le produit demander et recalcul le prix total a la fin
	 * 
	 * @param produit
	 * @throws Exception
	 */
	public void removeProduit(LigneCommande ligneCommande) throws Exception {
		
		try{
			vectCommande.removeElement(ligneCommande);
		}catch (Exception e){ throw new Exception(
				"********** Aucun produit supprime, produit non repertorie ! removeProduit(LigneCommande)");
		}

		calculPrixTotal();
	}
/*
	/**
	 * enleve les produits contenu dans le vecteur passer en parametre
	 * 
	 * @param vectProduit
	 * @throws Exception
	 *
	public void removeProduit(List<LigneCommande> listProduit) throws Exception {

		Iterator<LigneCommande> itr = listProduit.iterator();
		while (itr.hasNext()) {
			if (vectCommande.remove(itr.next()) == false) {
				throw new Exception(
						"********** Aucun produit supprime, produit non repertorie !");
			}
		}

		calculPrixTotal();
	}
*/
	/**
	 * enleve le produit a l<index calcul du prix total a la fin
	 * 
	 * @param index
	 *            Integer
	 * @throws Exception
	 */
	public void removeProduit(int index) throws Exception {

		try {
			vectCommande.remove(index);
		} catch (Exception e) {
			throw new Exception("********** Aucun produit supprime, index "
					+ index + " invalide !");
		}
		calculPrixTotal();
	}

	/**
	 * eneleve tout les produit du vecteur recalcul le prix total
	 */
	public void removeAllProduit() {
		vectCommande.clear();
		calculPrixTotal();
	}

	/**
	 * permet d'assigner un numero de commande de facon a ce que chaque numero
	 * soit unique
	 */
	private void setNumeroCommande() {
		numStatic++;
		numeroCommande = numStatic;

		setChanged();
		notifyObservers(this);

	}

	/**
	 * retourne le numero de commande qui a ete assigner dynamiquement
	 * 
	 * @return
	 */
	public int getNumeroCommande() {
		return numeroCommande;
	}

	/**
	 * assigne le num de commande par copi utiliser pour le construteur par copy
	 * 
	 * @param le
	 *            numero de la Commande
	 * @return
	 */
	private void setCopyNumeroCommande(int num) {
		numeroCommande = num;
	}

	/**
	 * pour assigner les client a la commande
	 * 
	 * @param client
	 *            a assosier
	 */
	public void setProfilClient(Profil profilClient) {
		this.profilClient = profilClient;
	}

	/**
	 * permet d<aller chercher le client assigner a la commande
	 * 
	 * @return le profilClient assigner a la commande
	 */
	public Profil getProfilClient() {
		return profilClient;
	}

	/**
	 * 
	 * @return vrai si la commande est vide
	 */
	public boolean estVide() {
		return vectCommande.isEmpty();
	}

	/**
	 * * @return le nombre de produit dans la commande
	 */
	public int nbProduit() {
		return vectCommande.size();
	}

	/*
	 * non utiliser pour le moment public void assignProfilLivreur(Profil
	 * profil){ profilLivreur = profil; }
	 * 
	 * public Profil getProfilLivreur(){ return profilLivreur; }
	 */

	/**
	 * passe a travers la Commande et recalcul de prix de chaque item pour enfin
	 * calculer le prix total
	 */
	private void calculPrixTotal() {
		prixTotal = 0.0;
		
		for (int index = 0; index < vectCommande.size(); index++)
			prixTotal = prixTotal + vectCommande.get(index).getTotal();

		setChanged();
		notifyObservers(this);
	}

	/**
	 * permet d<aller chercher le prix total de la commande
	 * 
	 * @return prix total de la commande
	 */
	public double getPrixTotal() {
		return prixTotal;
	}

	/**
	 * permet d<aller chercher une liste du vecteur
	 * 
	 * @return copy du vecteur de commande
	 */
	public Vector<LigneCommande> getList() {
		return (Vector<LigneCommande>) vectCommande.clone();
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getHeure() {
		return heure;
	}

	public void setHeure(String heure) {
		this.heure = heure;
	}

	public boolean estConfirmerParClient() {
		return confirmerClient;
	}

	public void setConfirmerParClient() {
		this.confirmerClient = true;
	}

	public boolean estConfirmerParLivreur() {
		return confirmerLivreur;
	}

	public void setConfirmerParLivreur() {
		this.confirmerLivreur = true;
	}

	/**
	 * @return the adresseRestaurant
	 */
	/**public Adresse getAdresseRestaurant() {
		return adresseRestaurant;
	}

	/**
	 * @param adresseRestaurant
	 *            the adresseRestaurant to set
	 */
	/**public void setAdresseRestaurant(Adresse adresseRestaurant) {
		this.adresseRestaurant = adresseRestaurant;
	}*/

	
	public String toString() {
		return ""+this.getNumeroCommande();
	}
	
	
	
	
	/**
	 * affiche les details de la commande - numero - nom du client assigner -
	 * tout les produits
	 */
	public String toStringDebug() {
		String str = "******************************************** \r\n"
				+ "Le Numero de commande est : " + getNumeroCommande() + " \r\n"
				+ "Il y a " + vectCommande.size()
				+ " produit(s) dans la commande \r\n";

		// +"Le nom du client est : "+getClient().getNomUsager())+"\n"
		// +"Le nom du livreur est ; "+getProfilLivreur().getNom "\n";

		Iterator<LigneCommande> itr = vectCommande.iterator();
		while (itr.hasNext()) {
			str = str.concat(itr.next().toString() + "\r\n");
		}

		str.concat("Le prix total est : " + prixTotal);

		return str;
	}

}
